//ShopCart.java
package shoppingcart;

import java.util.*;

/**
 * @author fhzheng
 * <h1> 购物车业务组件 </h1>
 * <li> 1 购物车业务可以有多复杂呢？
 * <li> 2 购物车中的商品数量和库存数量之间是什么关系
 * <li> 3 加商品和移除商品时，有哪些动作要发生，业务才完整
 * <li> 4 如果是真实的业务，数据存在库中，这些操作又将如何完成呢？
 * <li> 5 业务组件是系统的核心
 * <li> 6 不要低估直实业务的复杂性，思考企业级应用的挑战性
 * 
 */
public class ShopCart {
	
	/**
	 * <li>是一个List对象，存放商品
	 * <li>相当于是模拟购物车本身
	 * <li>用它的add和remove功能
	 * <li>还有iterator功能实现遍历
	 */
	private ArrayList<Product> cart=null;
	
	/**
	 * <li>用构造函数初始化购物车
	 */
	public ShopCart() {
		cart=new ArrayList<Product>();
	}
	
	/**
	 * <li>向购物车中添加商品
	 * @param product
	 */
	public void addProductToCart(Product product){  
		boolean is = false;
		//是否第一次购买
		for(int i=0; i<cart.size(); i++){
			//如果已经存在该商品，肯定不是第一次购买
			if(cart.get(i).getId().equals(product.getId())){ // 已存在
			   is = true;
			   // 每次只添加一件，购物车中添加一件，库存就会少一件
			   cart.get(i).setNum(cart.get(i).getNum()-1);	//为何为-1？
			   break;
			} 
		}
		//是第一次购买
		if(is == false){
			// 每次只添加一件
			// 动作1 库存同步
			product.setNum(99);	// 假设库存均为100件，首次添加购物车后，剩99件
			// 动作2 加购物车
			cart.add(product);
		}  
	}
	
	/**
	 * <li>从购物车中删除一商品
	 * @param productId
	 */
	public void removeProductFromCart(String productId){  
		if(cart==null)
			return;
		//用迭代器遍历找商品
		Iterator it=cart.iterator();
		while(it.hasNext()){
			Product item=(Product)it.next();
			if(item.getId().equals(productId)){
				// 动作1，从购物车中去掉该商品
				it.remove();
				// 动作2，库恢复
				item.setNum(100);
				return;
			}  
		}
	}
	
	/**
	 * <li>计算购物车中的商品总价格
	 * @return
	 */
	public double getAllProductPrice(){    
		if(cart==null)
			return 0;
		double totalPrice=0;
		// 购物车迭代器
		Iterator it=cart.iterator();
		while(it.hasNext()){
			Product item=(Product)it.next();
			//求的是之积之和，谁的积，谁的和？
			totalPrice += item.getPrice()*(100-item.getNum());
		}
		return totalPrice;
	}
	
	/**
	 * 返回购物车所有产品信息
	 * @return
	 */
	public List getAllProductsFromCart(){
		return cart;
	}
}
